package main

import (
	"fmt"
	"net/http"
	"os"
	"os/signal"
	"time"
)

// 演示Golang中如何优雅地退出进程
func main() {
	// 构建Http Server
	mux := http.NewServeMux()
	mux.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
		writer.Write([]byte("hello,world!"))
	})
	server := &http.Server{Addr: ":8080", Handler: mux}

	// 使用Go程来监听客户端的请求
	go func() {
		fmt.Println(server.ListenAndServe())
	}()

	// 接受监听系统传入的信号的通道
	sigs := make(chan os.Signal)

	// 监听信号（具有接收信号的响应能力），以聪明地释放资源、经一些清理工作结束最后再退出进程
	// 参数1：写通道类型，接受监听系统传入的的信号量的通道；参数2：变长参数，指定需要监听的信号
	signal.Notify(sigs)

	// 从通道中读/接收信号，无可用信号是阻塞等待
	c := <-sigs
	fmt.Println("信号:", c.String())
	fmt.Println("关闭HttpServer...")
	fmt.Println(server.Close())
	time.Sleep(20 * time.Second)
	fmt.Println("退出")
}
